% \iffalse meta-comment
%<*!driver>
%%
%% This is GERMAN.DTX/GERMAN.STY, Version 2.5b, 20. Jan 1995
%%
%% Copyright (C) 1987-1990 by H.Partl
%% Copyright (C) 1991-1995 by B.Raichle and DANTE e.V.
%%                         All rights reserved.
%%
%% Please read the documentation file `germdoc.tex' for more
%% information of how to use this macro file and how to install
%% the pattern files necessary for german hyphenation.
%%
%
% INSTALLATION GUIDE:
%
% The distribution of the `german' package consists of a set of
% files, which are packed and documented in _one_ `docstrip archive
% file' called `german.dtx'.  This archive file can be unpacked to
% create the necessary files containing the macros, implementation
% documentation, and other files.
%
% To unpack this archive file you need:
%
%   * `german.ins' (containing docstrip installation instructions)
%
%   * `german.dtx' (it is the file you are currently reading)
%
%   * `docstrip.tex' version 2.x or newer
%     (You can find this file in the LaTeX 2e release.)
%
% Then run `german.ins' through plainTeX or LaTeX to unpack the
% archive file:
%
%     tex german.ins
% or
%     latex german.ins
%
% This will create a set of file which contain the macro code or
% code to produce the implementation documentation of the `german'
% package.
%
% --------------- start of docstrip archive file ------------------
%
% \fi
% \CheckSum{1721}
%
% \CharacterTable
%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%   Digits        \0\1\2\3\4\5\6\7\8\9
%   Exclamation   \!     Double quote  \"     Hash (number) \#
%   Dollar        \$     Percent       \%     Ampersand     \&
%   Acute accent  \'     Left paren    \(     Right paren   \)
%   Asterisk      \*     Plus          \+     Comma         \,
%   Minus         \-     Point         \.     Solidus       \/
%   Colon         \:     Semicolon     \;     Less than     \<
%   Equals        \=     Greater than  \>     Question mark \?
%   Commercial at \@     Left bracket  \[     Backslash     \\
%   Right bracket \]     Circumflex    \^     Underscore    \_
%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%   Right brace   \}     Tilde         \~}
%
%
% \title{Style-Option "`german"' f"ur plain-\TeX, \LaTeX~2.09,
%        \LaTeXe\ und anderen auf diesen basierenden Formate}
% \date{20. Januar 1995}
% \author{Bernd Raichle \\
%         Koordinator "`german.sty"' \\
%         DANTE, Deutschsprachige Anwendervereinigung \TeX\ e.V.}
% \maketitle
%
% Diese Dokument beschreibt die Internas, Einschr"ankungen und einige
% Tricks und Kniffe, die bei der Implementierung der Style-Option
% "`german"' verwendet werden.  Wie diese Style-Option installiert
% und verwendet wird, ist in der "`Kurzanleitung -- {\tt
% german.sty}"' zu finden.  Diese Kurzanleitung ist in der Datei {\tt
% germdoc.tex} zu finden, die mit der Datei {\tt german.dtx} (bzw.\
% {\tt german.sty}) mitgeliefert wird.
%
% \StopEventually{}
%
% \tableofcontents
%
% \section{Identifikation des Pakets/der Makrodatei}
%
%  Damit diese Datei mehrmals geladen werden kann, und dabei
%  unn"otige Redefinitionen zu vermeiden, wird hier abgetestet, ob
%  die Datei schon zuvor geladen wurde.  Damit auch Nutzer mit
%  vorgeladenen, alten "`german"'-Versionen in den Genu"s dieser
%  neuen Version kommen, wird nicht, wie in den alten Versionen, der
%  Befehl |\mdqon|, sondern auf eine Versionsnummer abgestestet, die
%  aus der Jahreszahl und einer fortlaufenden Nummer gebildet wird.
%
%    \begin{macrocode}
\expandafter\ifx\csname grmn@VersionNo\endcsname\relax \else
\ifdim \number\grmn@VersionNo < 9502\relax
  \mathchardef\grmn@VersionNo=9502\relax % 2/95 = v2.5b
\else
  \germanTeX
  \expandafter\expandafter\expandafter\endinput%
\fi\fi
%    \end{macrocode}
%
%
% Die Style-Option "`german"' soll sowohl von plain-\TeX\ als auch
% von den unterschiedlichen \LaTeX-Versionen verwendet werden
% k"onnen.  Deshalb wird f"ur die Ausgabe meist \verb:\message:
% verwendet.
%
%    \begin{macrocode}
\message{Package `german', Version 2.5b of 95/01/20.}
%    \end{macrocode}
%
% F"ur \LaTeXe\ wird die Style-Option als Paket deklariert.  Da
% andere Style-Optionen evtl.\ den Befehl |\ProvidesPackage| nur auf
% {\tt undefined} abtesten, wird hier ein etwas komische anmutende
% Konstruktion mit einer Gruppe verwendet.
%
%    \begin{macrocode}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname ProvidesPackage\endcsname\relax\else
  \ProvidesPackage{german}[1995/01/20 v2.5b %
     Package for writing german texts (br)]
\fi
%    \end{macrocode}
%
% Da diese Datei auch mit einem simplen \verb:\input: geladen werden
% kann, andererseits aber auf interne Befehle zugegriffen werden
% mu"s, wird der {\it category code\/} des Zeichens~\verb:@:
% gerettet, bevor er auf "`letter"' ge"andert wird.
%
%    \begin{macrocode}
\chardef\atcode=\catcode`\@
\catcode`\@=11 % \makeatletter
%    \end{macrocode}
%
% \section{Kompatibilit"atsmakros}
%
% \subsection{Low-Level-Makros}
%
% Einige Makros aus dem \LaTeX-Format sind sehr hilfreich und werden,
% falls sie nicht definiert wurden, hier definiert.
%
%    \begin{macrocode}
\expandafter\ifx\csname @ifundefined\endcsname\relax
  \def\@ifundefined#1{%
    \expandafter\ifx\csname #1\endcsname\relax
      \expandafter\grmn@first\else\expandafter\grmn@second\fi}
\fi
%    \end{macrocode}
% Die Makros |\grmn@first| und |\grmn@second| werden sp"ater nochmals
% verwendet.
%    \begin{macrocode}
\def\grmn@dqfirst#1#2{#1}
\def\grmn@dqsecond#1#2{#2}
%    \end{macrocode}
%
% \subsection{Kompatibilit"atsmakros f"ur NFSS, Version~2}
%
% Das neue Fontauswahlschema~NFSS hat in Version~2 den neuen
% Fontparameter \verb:\fontencoding:.  NFSS~2 wurde offiziell im
% ersten \LaTeXe-Release vom 1.~Juni 1994 eingef"uhrt, jedoch im
% n"achsten Release vom 1.~Dezember 1995 durch Verbesserungen,
% Erweiterungen und neu eingef"uhrte Befehle verbessert.
%
% Im folgenden wird angenommen, dass NFSS~2 vorhanden ist, wenn der
% Befehl \verb:\DeclareTextSymbol: definiert ist.
%
%    \begin{macrocode}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname DeclareTextSymbol\endcsname\relax \else
%    \end{macrocode}
%
% \subsubsection{Deklarationsmakros}
%
% Die neueren NFSS~2-Versionen haben einige Befehle, die f"ur Symbole
% und Akzentmakros Defaultwerte f"ur diejenigen Fonts deklarieren,
% f"ur die keine expliziten Zeichencodes angegeben wurden.  Diese
% Befehle werden f"ur "altere NFSS~2-Versionen in einer sehr stark
% vereinfachter Realisierung nachfolgende definiert.  {\it In diesen
% Definitionen werden einige Internas aus \LaTeXe/NFSS~2 verwendet,
% so da"s dieser Teil der Style-Option evtl.\ zuk"unftig zu Fehlern
% f"uhren kann!  Der nachfolgende Teil ist als schlechtes Beispiel zu
% betrachten, wie man solche Dinge m"oglichst nicht realisieren
% sollte.}  {\bf Es ist daher ratsam, wenn man eine alte
% \LaTeXe-Release durch die neueste Version ersetzt.}
%
% Weiterhin wird angenommen, da"s der Befehl |\providecommand|
% verf"ugbar ist.  Dieser Befehl kann evtl.\ f"ur eine zuk"unftige
% NFSS~2-Version, die f"ur plain-\TeX\ angepa"st wurde, nicht
% verf"ugbar sein.
%
% |\UseTextSymbol{|\meta{encoding}|}{|\meta{symbol}|}| schaltet die
% angegebene Fontkodierung zur Ausgabe dieses Zeichens um.
%    \begin{macrocode}
\@ifundefined{UseTextSymbol}{%
  \def\UseTextSymbol#1#2{{\fontencoding{#1}\selectfont #2}}
}{}
%    \end{macrocode}
%
% |\UseTextAccent{|\meta{encoding}|}{|\meta{accent}|}{|\meta{base}|}|
% verwendet das Akzentzeichen aus dem Font mit der angegebenen,
% evtl.\ vom aktuellen Wert abweichenden Kodierung.
%    \begin{macrocode}
\@ifundefined{UseTextAccent}{%
  \def\UseTextAccent#1#2#3{%
    {\let\@curr@enc\f@encoding
     \fontencoding{#1}\selectfont
     #2{\fontencoding\@curr@enc\selectfont #3}}}%
}{}
%    \end{macrocode}
%
% |\ProvideTextCommand{|\meta{csname}|}{|\meta{encoding}|}[|^^A
% \meta{number}|][|\meta{default}|]{|\meta{definition}|}| definiert
% einen Befehl, der nur f"ur die angegebene Kodierung verwendet wird,
% falls dieser Befehl noch nicht f"ur diese Kodierung definiert
% wurde.
%    \begin{macrocode}
\@ifundefined{ProvideTextCommand}{%
  \def\ProvideTextCommand#1#2{%
    %%% misses \RobustTextCommand{#1}{...etc.etc...}!!
    \expandafter\providecommand\csname #2\string#1\endcsname}%
}{}
%    \end{macrocode}
%
% |\ProvideTextCommandDefault{|\meta{command}|}{|\meta{definition}|}|
% definiert nun eine Defaultdefinition f"ur alle Kodierungen, f"ur
% die keine explizite Definition angegeben wurde.  Leider w"urde eine
% einigerma"sen komplette Realisierung einer Reimplementierung der
% neueren NFSS~2-Versionen entsprechen, so da"s hier einfach nur eine
% Definition f"ur die zumeist f"ur alle nicht bekannten Kodierung
% verwendete Kodierung~{\glq}U{\grq} get"atigt wird.
%    \begin{macrocode}
\@ifundefined{ProvideTextCommandDefault}{%
  \def\ProvideTextCommandDefault#1{%
    \ProvideTextCommand{#1}{U}}%
}{}
%    \end{macrocode}
%
% Mit |\DeclareTextCompositeCommand{|\meta{command}|}{|^^A
% \meta{encoding}|}{|\meta{char}|}{|\meta{definition}|}| kann f"ur die
% Umlaut- und Trema-Kombinationen sehr bequem eine Definition
% angegeben werden.  Bevor hier f"ur die "alteren NFSS~2-Versionen
% eine eigene L"osung "`gestrickt"' wird, verl"a"st sich die
% nachfolgende Definition auf einige \LaTeXe/NFSS~2-Internas!
%    \begin{macrocode}
\@ifundefined{DeclareTextCompositeCommand}{%
  \def\DeclareTextCompositeCommand#1#2#3#4{%
    % define a `dummy' text composite
    \DeclareTextComposite{#1}{#2}{#3}{`\Z}%
    % then redefine this command including the new command
    \expandafter\def\csname\expandafter\string\csname
         #2\endcsname\string#1-\string#3\endcsname##1##2{#4}}%
}{}
%    \end{macrocode}
%
% \subsubsection{Makros f"ur Textzeichen}
%
% Neben den zuvor aufgezeigten Makros definieren die neueren
% NFSS~2-Versionen noch symbolische Namen f"ur viele der in den Fonts
% vorhandenen Textzeichen.  Im folgenden werden zum einen f"ur die
% "alteren Versionen die danach verwendeten symbolischen Namen
% nachdefiniert und zum anderen werden  fehlenden Definitionen f"ur
% die Kodierung~{tt OT1} und Defaults f"ur einige Zeichen
% nachgereicht.
%
% F"ur die Makros |\"|, |\ss| und |\i| sollte ein Default definiert
% sein.
%    \begin{macrocode}
\ProvideTextCommandDefault{\"}{\UseTextAccent{OT1}{\"}}
\ProvideTextCommandDefault{\ss}{\UseTextSymbol{OT1}\ss}
\ProvideTextCommandDefault{\i}{\UseTextSymbol{OT1}\i}
%    \end{macrocode}
%
% Dann sollte auch sichergestellt sein, da"s symbolische Namen f"ur
% die Zeichen definiert sind, die in den Makros f"ur die
% Anf"uhrungszeichen verwendet werden.  Die Defaults werden jeweils
% aus den Fonts mit Kodierung~{\tt OT1} genommen.
%
% Zuerst die Zeichen f"ur die Anf"uhrungszeichen "`\ldots"' und
% {\glq}\ldots{\grq}:
%    \begin{macrocode}
\@ifundefined{textquotedblleft}{%
  \ProvideTextCommandDefault{\textquotedblleft}{%
    \UseTextSymbol{OT1}\textquotedblleft}%
  \DeclareTextSymbol{\textquotedblleft}{OT1}{92}%
  \DeclareTextSymbol{\textquotedblleft}{T1}{16}%
}{}
\@ifundefined{textquotedblright}{%
  \ProvideTextCommandDefault{\textquotedblright}{%
    \UseTextSymbol{OT1}\textquotedblright}%
  \DeclareTextSymbol{\textquotedblright}{OT1}{`\"}%
  \DeclareTextSymbol{\textquotedblright}{T1}{17}%
  %% \DeclareTextSymbol{\textquotedbl}{T1}{`\"}%
}{}
\@ifundefined{textquoteleft}{%
  \ProvideTextCommandDefault{\textquoteleft}{%
    \UseTextSymbol{OT1}\textquoteleft}%
  \DeclareTextSymbol{\textquoteleft}{OT1}{`\`}%
  \DeclareTextSymbol{\textquoteleft}{T1}{`\`}%
}{}
\@ifundefined{textquoteright}{
  \ProvideTextCommandDefault{\textquoteright}{%
    \UseTextSymbol{OT1}\textquoteright}%
  \DeclareTextSymbol{\textquoteright}{OT1}{`\'}%
  \DeclareTextSymbol{\textquoteright}{T1}{`\'}%
}{}
\@ifundefined{quotesinglbase}{%
  \DeclareTextSymbol{\quotesinglbase}{T1}{13}%
}{}
\@ifundefined{quotedblbase}{%
  \DeclareTextSymbol{\quotedblbase}{T1}{18}%
}{}
%    \end{macrocode}
% danach die Anf"uhrungszeichen in franz"osischer Form ">\ldots"< und
% {\frq}\ldots{\flq}:
%    \begin{macrocode}
\@ifundefined{guillemotleft}{%
  \DeclareTextSymbol{\guillemotleft}{T1}{19}%
}{}
\@ifundefined{guillemotright}{%
  \DeclareTextSymbol{\guillemotright}{T1}{20}%
}{}
\@ifundefined{guilsinglleft}{%
  \DeclareTextSymbol{\guilsinglleft}{T1}{14}%
}{}
\@ifundefined{guilsinglright}{%
  \DeclareTextSymbol{\guilsinglright}{T1}{15}%
}{}
%    \end{macrocode}
%
% Damit sind die wichtigsten Makros so definiert, da"s die
% nachfolgenden Definitionen nur noch wenige F"alle unterscheiden
% m"ussen und damit "ubersichtlicher definiert werden k"onnen.
%
%    \begin{macrocode}
\fi
%    \end{macrocode}
%
% \section{Low-Level-Befehle f"ur die Style-Option}
%
% Die Style-Option verwendet Low-Level-Befehle zur Implementierung
% von An"-f"uhrungs"-zeichen, der Umlaute u.\,a.  Einige dieser
% Befehle sind auch f"ur Benutzer verf"ugbar.
%
% \subsection{Verschiedenes}
%
% \LaTeX\ verwendet den Befehl |\protect|, um {\it fragile\/}
% Kommandos zu sch"utzen.  Dieser Befehl mu"s f"ur plain-\TeX\
% nachdefiniert werden.  Folgendes Code-St"uck definiert diesen
% Befehl, falls er noch undefiniert ist, als \verb:\relax:,
% andernfalls wird |\protect| nicht ge"andert.
%    \begin{macrocode}
\expandafter\let\expandafter\protect\csname protect\endcsname
%    \end{macrocode}
%
% Mit |\allowhyphens| kann man \TeX\ signalisieren, da"s ein
% trennbarer Wortteil endet (durch den \verb:\penalty:-) und ein
% neuer beginnt (durch den |\hskip|-Befehl, der {\it glue\/}
% ein"-f"ugt.  Dieser Trick ist in Anhang~D des \TeX{}book
% beschrieben, die Internas dazu in Anhang~H.
%\begin{verbatim}
%\def\allowhyphens{\nobreak \hskip 0pt plus 0pt\relax}
%\end{verbatim}
% entspricht der nachfolgenden Definition:
%    \begin{macrocode}
\def\allowhyphens{\penalty\@M \hskip\z@skip}
%    \end{macrocode}
%
% Neben den Umlauten mu"s auch daf"ur gesorgt werden, da"s nach dem
% Buchstabe~{\ss} getrennt werden kann.  |\ss| entspricht f"ur Fonts
% mit Kodierung~{\tt OT1} dem Zeichen auf Position~\verb:^^Y:.  Um
% W"orter mit diesem Zeichen trennbar zu machen, reicht es aus, wenn
% man den |\lccode| dieses Zeichen auf einen Wert ungleich Null
% setzt.  F"ur ein |\ss| aus anderen Fonts mu"s dies im
% entsprechenden Makrofile getan werden, in dem der Font und der
% Befehl~|\ss| redefiniert wird.
%    \begin{macrocode}
\lccode`\^^Y=`\^^Y
%    \end{macrocode}
%
% \subsection{Anf"uhrungszeichen}
%
% Die deutschen Anf"uhrungszeichen werden f"ur Fonts, die keine
% geeigneten Zeichen besitzen, durch die im englischsprachigen Raum
% gebr"auchlichen Anf"uhrungszeichen durch Box-Manipulationen
% erzeugt.
%
% |\set@low@box| verschiebt das Zeichen im Argument, normalerweise ``
% bzw.\ '' auf die H"ohe des normalen Kommas.  Da das Makro den
% Inhalt der Box 0, 2 und ein L"angenregister "andert, sollte dieses
% Makro nur innerhalb einer Gruppe aufgerufen werden.
%    \begin{macrocode}
\def\set@low@box#1{\setbox\tw@\hbox{,}\setbox\z@\hbox{#1}%
  \setbox\z@\hbox{\dimen@\ht\z@ \advance\dimen@ -\ht\tw@
      \lower\dimen@\box\z@}%
  \ht\z@\ht\tw@ \dp\z@\dp\tw@}
%    \end{macrocode}
%
% Normalerweise wird der aktuelle |\spacefactor| nicht von
% An"-f"uhrungs"-zeichen ge"-"andert so da"s bei aktiviertem
% |\nonfrenchspacing| nach einem Satzzeichen ein gr"o"serer
% Wortzwischenraum gelassen wird.   Da \TeX\ den |\spacefactor| nach
% einem Box-Befehl auf~1000 setzt, mu"s man den |\spacefactor| von
% Hand vorher retten und danach wieder setzen, um dieses Verhalten
% nicht zu "andern.
%    \begin{macrocode}
\def\save@sf@q#1{{\ifhmode
  \edef\@SF{\spacefactor\the\spacefactor}\else
  \let\@SF\empty \fi \leavevmode #1\@SF}}
%    \end{macrocode}
%
% \subsection{Umlaute}
%
% Wird ein Umlaut mit Hilfe von \TeX{}s |\accent|-Primitiv erzeugt,
% werden bei den meisten Fonts die Umlautpunkte zu hoch gesetzt.  Sie
% entsprechen dadurch eher einem Trema.   Das Makro |\umlaut| ersetzt
% das \TeX-Primitiv, um Umlaute mit etwas tieferen Umlautpunkten zu
% erzeugen.   Das |\accent|-Primitiv hat die Eigenschaft, die
% aktuelle {\it x-height\/} und die Gr"o"se des Buchstabens zu
% verwenden, um die vertikale  Positionierung der Punkte zu
% bestimmen.   Um die Punkte etwas tiefer zu setzen, kann nun
% entweder die H"ohe des Buchstaben verkleinert oder die {\it
% x-height} vergr"o"sert werden.  Da das |\accent|-Primitiv keine Box
% als Argumente erlaubt, wird der zweite Weg gew"-"ahlt.  Dabei mu"s
% beachtet werden, da"s "Anderungen der |\fontdimen| immer global
% ausgef"uhrt werden!
%    \begin{macrocode}
\expandafter\ifx\csname grmn@U@D\endcsname\relax
  \csname newdimen\endcsname\grmnU@D
\fi
\def\newumlaut#1{{\grmnU@D 1ex%
  {\setbox\z@\hbox{\char127}\dimen@-.45ex\advance\dimen@\ht\z@
  \ifdim 1ex<\dimen@ \fontdimen5\font\dimen@ \fi}%
  \accent127\fontdimen5\font\grmnU@D #1}\allowhyphens}
%    \end{macrocode}
%
% F"ur Tremas wird das urspr"ungliche |\accent|-Primitive verwendet.
% Da die Style-Option das |\"|-Makro "andert, mu"s hier die originale
% Definition selbst verwendet werden, wobei durch das |\allowhyphens|
% nach dem Akzentprimitiv die Trennung im Rest des Wortes wieder
% erlaubt.   F"ur \LaTeXe\ kann durch die ge"anderten Internas das
% |\"|-Makro direkt verwendet werden, wobei auch hier ein
% |\allowhyphens| die Trennung im nachfolgenden Wortteil wieder
% erlaubt.
%    \begin{macrocode}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname DeclareTextSymbol\endcsname\relax
  \def\highumlaut#1{{\accent127 #1}\allowhyphens}
\else
  \def\highumlaut#1{\"{#1}\allowhyphens}
\fi
%    \end{macrocode}
%
% \subsection{Mechanismus f"ur aktivierten Double\-quote}
%
% Die Style-Option "`german"' verwendet ein aktiviertes
% Doublequote-Zeichen.  Mit den Makros |\mdqon| und |\mdqoff| werden
% hierzu Befehle zum Hin- und Herschalten definiert.
%    \begin{macrocode}
\def\mdqon{\catcode`\"\active}
\def\mdqoff{\catcode`\"12\relax}
%    \end{macrocode}
%
% Der Mechanismus der die Eingabenotation, die einen aktiven
% Double\-quote verwendet, realisiert, verwendet weitere symbolische
% Namen f"ur Makros und spezielle Zeichen.
%    \begin{macrocode}
\begingroup \mdqoff
\def\x{\endgroup
  \def\@UMLAUT{\"}%
  \def\@MATHUMLAUT{\ddot}% = \mathaccent"707F
  \def\@SS{\mathchar"7019 }% TODO: correct?
  \def\dq{"}}% TODO: or \textquotedbl?
\x
%    \end{macrocode}
%
% Da das Zeichen aktiviert wird, mu"s es f"ur bestimmte Kontexte
% explizit wieder deaktiviert werden.  plain-\TeX\ und \LaTeX\
% verwenden f"ur Umgebungen, wie {\tt verbatim}, die Befehle
% |\dospecials| und |\@sanitize|, die Listen mit diesen speziellen
% Zeichen darstellen.  Der Double-quote wird an diese Listen
% angeh"angt.
%    \begin{macrocode}
\begingroup
  \def\do{\noexpand\do\noexpand}%
  \edef\x{\endgroup
    \def\noexpand\dospecials{\dospecials\do\"}}%
\x
%    \end{macrocode}
% |\@sanitize| ist nur f"ur \LaTeX\ definiert, so da"s dessen
% Existenz explizit abgefragt wird.
%    \begin{macrocode}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname @sanitize\endcsname\relax \else
  \begingroup
    \def\@makeother{\noexpand\@makeother\noexpand}%
    \edef\x{\endgroup
      \def\noexpand\@sanitize{\@sanitize\@makeother\"}}%
  \x
\fi
%    \end{macrocode}
%
% \subsection{Kompatibilit"at mit "alteren Versionen}
%
% "Altere Versionen der Style-Option "`german"' definieren die
% Befehle |\3| und |\ck|, die nicht mehr verwendet werden sollten.
% Damit alte Dokumente mit diesen Kommandos nicht ge"andert werden
% m"ussen, existieren diese Befehle auch noch f"ur Version~2.x.
%    \begin{macrocode}
\let\grmn@original@three=\3 % \3 may be defined or undefined.
\def\ck{\penalty\@M\discretionary{k-}{}{c}k\allowhyphens}
%    \end{macrocode}
%
%
% \section{Anf"uhrungszeichen}
%
% Die Makros |\glqq|, |\grqq|, |\glq|, |\grq|, |\flqq|, |\frqq|,
% |\flq| und |\frq| f"ur die Anf"uhrungzeichen k"onnen mit NFSS
% Version~2 (also mit \LaTeXe) abh"angig von der Kodierung des Fonts
% definiert werden.
%    \begin{macrocode}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname DeclareTextSymbol\endcsname\relax
%    \end{macrocode}
%
% \subsection{\ldots~ohne NFSS Version~2}
%
% Ohne NFSS Version~2 werden die Makros aus den "`alten"' Versionen
% dieser Style-Option verwendet.  Da diese Makros alle Zeichen "uber
% symbolische Befehle oder Ligaturen, sollten die Ergebnisse f"ur die
% meisten Fonts korrekt sein, jedoch wird wegen der Makros kein
% Kerning durchgef"uhrt und keine Ligaturen gebildet.
%
% Zuerst einmal die Makros f"ur die Anf"uhrungszeichen "`\ldots"' und
% {\glq}\ldots{\grq}.
%    \begin{macrocode}
\def\@glqq{\save@sf@q{\set@low@box{''\/}\box\z@
             \kern-.04em\allowhyphens}}
\def\glqq{\protect\@glqq}
\def\@grqq{\save@sf@q{\kern-.07em``\kern.07em}}% ('')
\def\grqq{\protect\@grqq}
\def\@glq{\save@sf@q{\set@low@box{'\/}\box\z@
            \kern-.04em\allowhyphens}}
\def\glq{\protect\@glq}
\def\@grq{\save@sf@q{\kern-.0125em`\kern.07em}}
\def\grq{\protect\@grq}
%    \end{macrocode}
% Danach folgen die Definitionen f"ur die franz"osische Form der
% Anf"uhrungszeichen "<\ldots"> und {\flq}\ldots{\frq}.  Da die
% Definition auch f"ur plain-\TeX\ verwendbar sein soll, k"onnte man
% das Aussehen durch eine etwas andere Definition noch verbessern.
%    \begin{macrocode}
\def\@flqq{\relax\ifmmode \ll \else \save@sf@q{\penalty\@M
    \raise .2ex\hbox{$\scriptscriptstyle \ll $}\allowhyphens}\fi}
\def\flqq{\protect\@flqq}
\def\@frqq{\relax\ifmmode \gg \else \save@sf@q{\penalty\@M
    \raise .2ex\hbox{$\scriptscriptstyle \gg $}\allowhyphens}\fi}
\def\frqq{\protect\@frqq}
\def\@flq{\relax\ifmmode <\else \save@sf@q{\penalty\@M
    \raise .2ex\hbox{$\scriptscriptstyle <$}\allowhyphens}\fi}
\def\flq{\protect\@flq}
\def\@frq{\relax\ifmmode >\else \save@sf@q{\penalty\@M
    \raise .2ex\hbox{$\scriptscriptstyle >$}\allowhyphens}\fi}
\def\frq{\protect\@frq}
%    \end{macrocode}
% Leider verhindert das |\nobreak| in |\allowhyphens| eine Trennung
% an einem Wortzwischenraum, der nach dem Anf"uhrungszeichen folgen
% kann.  Da die obige Definition sowohl f"ur ">\ldots"< als auch f"ur
% "<\ldots"> verwendbar sein mu"s, kann man ohne weitere Tricks
% nichts an dieser Einschr"ankung "andern.
%
%    \begin{macrocode}
\else
%    \end{macrocode}
%
% \subsection{\ldots~mit NFSS Version~2}
%
% Das Kommando |\glqq| entspricht dem in neueren \LaTeXe-Releases
% definiertem Symbol |\quotedblbase|.  Die Definitionen dieses
% Symbols werden auch f"ur die {\tt OT1}-kodierten Fonts erweitert,
% so da"s man eine relativ einfache Definition erh"alt.  Leider
% existiert f"ur |\grqq| kein entsprechendes Pendant, so da"s man
% hier auf die "`alte"' Version zur"uckgreifen mu"s.
%    \begin{macrocode}
\DeclareRobustCommand{\glqq}{%
  \ifmmode\mbox{\quotedblbase}\else\quotedblbase\fi}
\ProvideTextCommandDefault{\quotedblbase}{%
  \UseTextSymbol{OT1}\quotedblbase}
\ProvideTextCommand{\quotedblbase}{OT1}{%
  \save@sf@q{\set@low@box{\textquotedblright\/}\box\z@
    \kern-.04em\allowhyphens}}
\DeclareRobustCommand{\grqq}{%
  \save@sf@q{\kern-.07em%
  \ifmmode\mbox{\textquotedblleft}\else\textquotedblleft\fi
  \kern.07em\relax}}
%    \end{macrocode}
% Entsprechend werden die Symbole |\glq| und |\grq| definiert\,\ldots
%    \begin{macrocode}
\DeclareRobustCommand{\glq}{%
  \ifmmode\mbox{\quotesinglbase}\else\quotesinglbase\fi}
\ProvideTextCommandDefault{\quotesinglbase}{%
  \UseTextSymbol{OT1}\quotesinglbase}
\ProvideTextCommand{\quotesinglbase}{OT1}{%
  \save@sf@q{\set@low@box{\textquoteright\/}\box\z@
    \kern-.04em\allowhyphens}}
\DeclareRobustCommand{\grq}{%
  \save@sf@q{\kern-.0125em%
  \ifmmode\mbox{\textquoteleft}\else\textquoteleft\fi
  \kern.07em\relax}}
%    \end{macrocode}
% \ldots\,und auch die franz"osische Form der Anf"uhrungszeichen.
%    \begin{macrocode}
\DeclareRobustCommand{\flqq}{%
  \ifmmode\mbox{\guillemotleft}\else\guillemotleft\fi}
\ProvideTextCommandDefault{\guillemotleft}{%
  \UseTextSymbol{OT1}\guillemotleft}
\ProvideTextCommand{\guillemotleft}{OT1}{%
  \ifmmode \ll \else \save@sf@q{\penalty\@M
    \raise .2ex\hbox{$\scriptscriptstyle \ll $}\allowhyphens}\fi}
\DeclareRobustCommand{\frqq}{%
  \ifmmode\mbox{\guillemotright}\else\guillemotright\fi}
\ProvideTextCommandDefault{\guillemotright}{%
  \UseTextSymbol{OT1}\guillemotright}
\ProvideTextCommand{\guillemotright}{OT1}{%
  \ifmmode \gg \else \save@sf@q{\penalty\@M
    \raise .2ex\hbox{$\scriptscriptstyle \gg $}\allowhyphens}\fi}
%    \end{macrocode}
%    \begin{macrocode}
\DeclareRobustCommand{\flq}{%
  \ifmmode\mbox{\guilsinglleft}\else\guilsinglleft\fi}
\ProvideTextCommandDefault{\guilsinglleft}{%
  \UseTextSymbol{OT1}\guilsinglleft}
\ProvideTextCommand{\guilsinglleft}{OT1}{%
  \ifmmode <\else \save@sf@q{\penalty\@M
    \raise .2ex\hbox{$\scriptscriptstyle <$}\allowhyphens}\fi}
\DeclareRobustCommand{\frq}{%
  \ifmmode\mbox{\guilsinglright}\else\guilsinglright\fi}
\ProvideTextCommandDefault{\guilsinglright}{%
  \UseTextSymbol{OT1}\guilsinglright}
\ProvideTextCommand{\guilsinglright}{OT1}{%
  \ifmmode >\else \save@sf@q{\penalty\@M
    \raise .2ex\hbox{$\scriptscriptstyle >$}\allowhyphens}\fi}
%    \end{macrocode}
%
% Damit w"aren die Makros f"ur die Anf"uhrungszeichen definiert
% und die Unterscheidung mit/ohne NFSS Version~2 wird f"ur's erste
% nicht mehr ben"otigt.
%    \begin{macrocode}
\fi
%    \end{macrocode}
%
%
% \section{Anpassung der Umlautmakros}
%
% Wie schon bei der Definition des Befehls |\umlaut| erw"ahnt,
% mu"s das Akzentmakro f"ur die Umlaute angepa"st werden.
%
% Um sp"ater zwischen der Original- und der neuen Definition
% umschalten zu k"onnen, werden die internen Umschaltbefehle
% |\umlauthigh| und |\umlautlow| definiert.  Da NFSS Version~2
% schon wieder eine Sonderrolle -- im positiven Sinne -- spielen
% mu"s, wieder eine Unterscheidung der Versionen.
%    \begin{macrocode}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname DeclareTextSymbol\endcsname\relax
%    \end{macrocode}
%
% F"ur Versionen ohne NFSS Version~2 wird relativ einfach zwischen
% den beiden Versionen gewechselt.  Wenn man Fonts mit ge"anderten
% Kodierungen verwenden will, mu"s dieses Makro ebenso angepa"st
% werden.
%    \begin{macrocode}
\def\umlauthigh{\def\"##1{{\accent127 ##1}}}
\def\umlautlow{\def\"{\protect\newumlaut}}
%    \end{macrocode}
%    \begin{macrocode}
\else
%    \end{macrocode}
%
% F"ur NFSS Version~2 ist das ganze etwas komplizierter.
% Da die \verb:\DeclareText...:-Befehle nicht mehr nach der Pr"aambel
% verwendet werden d"urfen, wird der neue symbolische Name
% |\grmn@OTumlaut| f"ur das Umlautmakro f"ur Fonts in Kodierung~{\tt
% OT1} definiert.  Beim Umschalten wird dann die Definition dieses
% Makro ver"andert.
%    \begin{macrocode}
\def\umlauthigh{\def\grmn@OTumlaut##1{{\accent 127 ##1}}}
\def\umlautlow{\def\grmn@OTumlaut{\protect\newumlaut}}
\umlauthigh
%    \end{macrocode}
% F"ur Fonts mit Kodierung {\tt OT1} und~{\tt T1} werden hier
% Standarddefinitionen angegeben, in der das neue makro verwendet
% wird.
%    \begin{macrocode}
\DeclareTextAccent{\"}{T1}{4}
\DeclareTextAccent{\"}{OT1}{127}
\DeclareTextCompositeCommand{\"}{OT1}{a}{\grmn@OTumlaut{a}}%
\DeclareTextCompositeCommand{\"}{OT1}{o}{\grmn@OTumlaut{o}}%
\DeclareTextCompositeCommand{\"}{OT1}{u}{\grmn@OTumlaut{u}}%
\DeclareTextCompositeCommand{\"}{OT1}{A}{\grmn@OTumlaut{A}}%
\DeclareTextCompositeCommand{\"}{OT1}{O}{\grmn@OTumlaut{O}}%
\DeclareTextCompositeCommand{\"}{OT1}{U}{\grmn@OTumlaut{U}}%
\DeclareTextComposite{\"}{T1}{a}{228}
%    \end{macrocode}
%
% Da diese Definitionen in einer "alteren Patch-Datei am Beginn eines
% Dokuments ge"andert werden, werden diese "Anderungen einfach
% nochmals mit den oben angegebenen Anweisungen "uberschrieben.
%    \begin{macrocode}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname AtBeginDocument\endcsname\relax \else
  \AtBeginDocument{%
    \DeclareTextAccent{\"}{T1}{4}%          % from `ltpatch.tex' 
    \DeclareTextAccent{\"}{OT1}{127}%       % from `ltpatch.tex'
    % \DeclareTextCommand{\"}{OT1}{\newumlaut}% from `ltpatch.tex'
    % % has to be removed
    \DeclareTextCompositeCommand{\"}{OT1}{a}{\grmn@OTumlaut{a}}%
    \DeclareTextCompositeCommand{\"}{OT1}{o}{\grmn@OTumlaut{o}}%
    \DeclareTextCompositeCommand{\"}{OT1}{u}{\grmn@OTumlaut{u}}%
    \DeclareTextCompositeCommand{\"}{OT1}{A}{\grmn@OTumlaut{A}}%
    \DeclareTextCompositeCommand{\"}{OT1}{O}{\grmn@OTumlaut{O}}%
    \DeclareTextCompositeCommand{\"}{OT1}{U}{\grmn@OTumlaut{U}}%
    \DeclareTextComposite{\"}{T1}{a}{228}%  % from `ltpatch.tex'
  }
\fi
%    \end{macrocode}
%    \begin{macrocode}
\fi
%    \end{macrocode}
%
%
% \section{Mechanismus f"ur Doublequote-Notation}
%
% Die Eingabenotation \verb:"x: f"ur Umlaute, spezielle Trennungen
% u.\,a.\, die die Style-Option "`german"' anbietet, wird durch den
% {\it active character\/} Double-Quote realisiert.  Dieses aktive
% Zeichen liest sein n"achstes Argument und entscheidet abh"angig von
% diesem Argument, welche Kommandos zur Realisierung verwendet werden
% sollen.
%
% Nach dieser Beschreibung scheint die Makrodefinition, die diesem
% aktiven Zeichen zugewiesen wird, relativ einfach zu realisieren zu
% sein:
%\begin{verbatim}
%\catcode`\"=\active
%\def "#1{\ifx#1a\newumlaut{a}\else ...etc.etc... \fi}
%\end{verbatim}
% Leider gibt es bei dieser einfachen Implementierung einige
% Fehlerm"oglichkeiten: Zum einen "uberliest \TeX\ vor jedem nicht
% begrenztem Argument eines Makros alle Leerzeichen, so da"s die
% beiden Eingaben \verb:" a: und~\verb:"a: nicht unterscheidbar sind.
% Zum zweiten erzeugen die Gruppenklammern \verb:{: und~\verb:}:
% Fehler, da bei einer "offnenden Klammer eine komplette Liste
% gelesen wird und eine geschlossene Klammer zu einem Fehler f"uhrt.
%
% Will man diese Probleme mit der etwas "`schlaueren"' L"osung
%\begin{verbatim}
%\catcode`\"=\active
%\def "{\afterassignment\do@activedq \let\next= }
%\def\do@activedq{\ifx\next\bgroup \def\next{\dq\bgroup}\else
%   \ifx\next\egroup \def\next{\dq\egroup}\else
%   \expandafter\ifx\space\next \def\next{\dq\space}\else
%   \ifx a\next \def\next{\newumlaut{a}}\else
%   ...etc.etc... \fi\fi\fi...\fi \next}
%\end{verbatim}
% vermeiden, handelt man sich ein anderes, schwerwiegenderes Problem
% ein:  In \TeX\ kann man ganzzahlige Konstanten auch in hexadezimaler
% Notation eingeben.  Dazu wird einfach der hexadezimalen Zahl ein
% normale Double\-quote vorangestellt (Bsp.: \verb:"FF: f"ur die
% Konstante~255).  Mit der "`schlaueren"' L"osung meldet \TeX\ jedoch
% beim Einlesen aller hexadezimalen Konstanten bei aktiviertem
% Double\-quote eine fehlende Zahl.  Der Grund ist einfach:
% Primitive, wie \verb:\afterassignment: oder \verb:\futurelet:, sind
% nicht expandierbar und nichtexpandierbare Token beenden das
% Scan\-nen einer Zahl.
%
% Um diesen schwerwiegenden Nachteil dieser L"osung vermeiden (die
% "ahnlich in Version~2.3c/d verwendet wurde, wobei schon in den
% Versionen 2.2--2.3b ein \verb:\relax: diesen Fehler erzeugt), mu"s
% man wohl oder "ubel die erste L"osung mit deren Nachteilen
% verwenden.
%
% Auf einen anderen Punkt mu"s auch geachtet werden: Damit \TeX\ f"ur
% die resultierenden Umlaute und An"-f"uhrungs"-zeichen ein Kerning
% durch"-f"uhrt und Ligaturen bildet, darf vor und nach diesen
% Zeichen keine nichtexpandierbaren Token, wie Gruppenklammern,
% \verb:\relax:, etc., in der Eingabe "`stehenbleiben"'.  Dies mu"s
% insbesondere auch f"ur die F"alle gelten, in denen der
% Double\-quote eine hexadezimale Konstante einleitet!
%
%
% \subsection{Fehler bei undefinierten {\tt\char34x}-Kombinationen}
%
% F"ur Argumente des Double\-quote-Makros, f"ur die keine Bedeutung
% definiert wurde, sollte eine Warnung an den Benutzer ausgegeben
% werden.  Dies verhindert zum einen, da"s einfache Tippfehler
% "uber"-sehen werden, zum anderen gibt es in sp"ateren Versionen, in
% denen f"ur weitere Argumente Bedeutungen definiert werden, weniger
% Fehler in alten Dokumenten.
%
% Mit dem (undokumentierten) Befehl |\dqwarninglevel| kann festgelegt
% werden, bei welchen Befehlen Warnungen ausgegeben werden:
% 0~bedeutet momentan keine Warnung, 1~nur f"ur undefinierte
% Kombinationen (Default) und 2~auch Warnungen f"ur die Befehle f"ur
% drei gleiche Konsonanten.
%    \begin{macrocode}
\def\dqwarninglevel#1{\chardef\grmn@dqwarninglevel=#1\relax}
\dqwarninglevel{1}
%    \end{macrocode}
%
% Neuere \LaTeX-Versionen verwenden den in \TeX~3 vorhandenen
% Parameter \verb:\inputlineno:, um mit jeder Fehlermeldung auch die
% Zeilennummer auszugeben.  Da dies allgemein sinnvoll ist, wird das
% dazu benutzte \LaTeX-Makro definiert, falls es bei Verwendung von
% plain-\TeX\ oder einer alten \LaTeX-Version noch nicht definiert
% ist und \TeX~3 verwendet wird (\verb:\inputlineno: mu"s existieren
% und einen positiven Wert beinhalten).
%    \begin{macrocode}
\expandafter\ifx\csname on@line\endcsname\relax
  \ifx\inputlineno\undefined \let\on@line\@empty
  \else
    \ifnum\inputlineno<\z@ \let\on@line\@empty
    \else \def\on@line{ on input line \the\inputlineno}
\fi\fi\fi
%    \end{macrocode}
%
% F"ur die Warnungen und Fehlermeldungen werden zwei weitere Makros
% definiert.
%    \begin{macrocode}
\def\grmn@dq@error#1{%
  \errhelp{Use `` for a simple double quote character.}%
  \errmessage{german: The command \dq\string#1 is undefined}}
\def\grmn@dq@warning#1{%
   \immediate\write\sixt@@n{german: %
       \dq\string#1 is possibly wrong\on@line.}}
%    \end{macrocode}
%
%
% \subsection{Definition der Double\-quote-Befehle}
%
% Jede definierter Double\-quote-Befehl wird in einem eigenen Makro
% abgelegt, in dessen Name das Argument, also das einzelne Zeichen
% nach dem Double\-quote, als Schl"ussel verwendet wird.
%
% Das Makro |\grmn@dq@macro| hat zwei Argumente und erzeugt unter
% Verwendung des zweiten Arguments diesen Makronamen.  Das erste
% Argument, ein einzelnes Token, wird vor diesen Makronamen gesetzt.
% Dies zuerst etwas komisch anmutende Kombination von Argumenten
% verhindert, da"s bei der Verwendung dieses Makros nicht Unmengen
% von \verb:\expandafter:-Anweisungen notwendig werden.  Der Befehl
% \verb:\string: verhindert, da"s aktive Zeichen als Argumente
% (z.\,B.\ eine Tilde) keine Fehler erzeugen.
%    \begin{macrocode}
\def\grmn@dq@macro#1#2{%
  \expandafter#1\csname @grmn@@\string #2dq\endcsname}
%    \end{macrocode}
%
% Neue Befehlskombinationen k"onnen mit dem Befehl |\def@dqmacro|
% definiert werden.  Argument~1 ist dabei das Zeichen im Befehl,
% Argument 2 und~3 die Expansion, die f"ur Text- und
% Mathematik"-modus verwendet werden sollen.
%    \begin{macrocode}
\def\def@dqmacro#1#2#3{%
  \grmn@dqredefcheck{#1}%
  \grmn@dq@macro\def{#1}{{#2}{#3}}}
%    \end{macrocode}
%
% Ein Synonym f"ur einen schon zuvor definierten Befehl kann man mit
% |\let@dqmacro| definieren.
%    \begin{macrocode}
\def\let@dqmacro#1#2{\begingroup
  \grmn@dqredefcheck{#1}%
  \edef\x{\endgroup \let
    \grmn@dq@macro\noexpand{#1}\grmn@dq@macro\noexpand{#2}}%
  \x}
%    \end{macrocode}
%
% Wird ein zuvor definierter Befehl erneut definiert oder
% umdefiniert, sollte dies zumindest in der Log-Datei erscheinen, um
% gemeldete Fehler, die darauf zur"uckzuf"uhren sind, einfacher
% erkennen zu k"onnen.  Hier wird f"ur das Makro
% |\grmn@dqredefcheck|, das diese Zeile in die Log-Datei schreibt,
% ein Dummy definiert, die sp"ater durch die end"-g"ultige
% Makrodefinition ersetzt wird.
%    \begin{macrocode}
\def\grmn@dqredefcheck#1{}
%    \end{macrocode}
%
%
% \subsection{Makros f"ur den aktiven Double\-quote}
%
% Das Makro |\@active@dq| wird sp"ater an das aktive
% Double\-quote-Zeichen gebunden.  Dieses liest das n"achste Zeichen
% (mit den zuvor schon genannten Einschr"ankungen), pr"uft ab, ob
% hier"-f"ur eine Bedeutung definiert wurde und gibt in diesem Falle
% einen Fehler aus.
%    \begin{macrocode}
\def\@active@dq#1{%
  \grmn@dq@macro\ifx{#1}\relax
    \ifnum\grmn@dqwarninglevel>\z@ \grmn@dq@error{#1}\fi
    \expandafter\grmn@@normal@dq
  \else
    \expandafter\grmn@@active@dq
  \fi {#1}}
%    \end{macrocode}
%
% Leitet der Double\-quote eine hexadezimale Konstante ein, folgt
% also eine Ziffer oder ein Gro"sbuchstabe im Bereich~\mbox{A--F}, so
% soll "`nichts"' unternommen werden.  Um diese spezielle Befehle zu
% erkennen, werden den zugeordneten {\it control sequences\/} sp"ater
% die Bedeutung eines \verb:\noexpand: zugeordnet.
%    \begin{macrocode}
\def\grmn@@active@dq#1{%
  \grmn@dq@macro\ifx{#1}\noexpand
    \expandafter\grmn@normal@dq
  \else
    \expandafter\grmn@@@active@dq
  \fi {#1}}
%    \end{macrocode}
%
% F"ur die F"alle, in denen Anf"uhrungszeichen erzeugt werden sollen,
% werden zwei weitere Befehle: |\grmn@normal@dq| wird f"ur die
% hexadezimalen Konstanten verwendet, in denen ein Double\-quote
% ben"otigt wird.  |\grmn@@normal@dq| wird dagegen im Fehlerfalle
% verwendet und gibt zwei einzelne Quotes aus, um Endlosschleifen bei
% der Expansion zu vermeiden.
%    \begin{macrocode}
\def\grmn@@normal@dq#1{``#1}
\def\grmn@normal@dq#1{\dq #1}
%    \end{macrocode}
%
%
% \subsection{Sch"utzen von zerbrechlichen Bedeutungen}
%
% Da die Double\-quote-Befehle auch zu zerbrechlichen Bedeutungen
% expandieren kann, mu"s ein \verb:\protect: o.\,"a.\ so eingef"ugt
% werden, da"s einerseits keine nicht expandierbaren Token eingef"ugt
% werden.  Andererseits kann, wie im Falle einer Tilde,  auch das
% Argument selbst expandierbar sein und bei mehrfachem Lesen und
% Schreiben entsprechend gesch"utzt werden (z.\,B.\ der Inhalt von
% \LaTeX's aux- wird wieder in das toc-File geschrieben, bevor es
% end"-g"ultig eingelesen wird).
%
% Aus letzterem Grund folgt jetzt ein Hack mit {\it category
% codes\/}, um beim Schreiben auf ein File keine zus"atzlichen
% Zeichen ein"-f"ugen zu m"ussen, wie dies in Version~2.4a gemacht
% wurde.
%
% Im folgenden ben"otigt dieser Hack geschweifte Klammern mit {\it
% category code\/} "`other"'.  Als tempor"arer Ersatz f"ur diese
% Klammern werden die runden Klammern verwendet.  Au"serdem wird der
% in \LaTeX2e\ verwendete Trick mit einem Leerzeichen im Makroname
% verwendet, um diese speziellen Klammern f"ur "`interne"'
% Expansionen, wie beim Primitiv \verb:\marks:, wieder korrekt
% einlesen zu k"onnen. 
%    \begin{macrocode}
\begingroup
  \catcode`\(=1\lccode`\(=`\{\catcode`\{=12
  \catcode`\)=2\lccode`\)=`\}\catcode`\}=12
  \catcode`\ =11\relax% <= do not delete these and the
\lowercase(\endgroup% <=== following percent characters!
%    \end{macrocode}
%
% Zuerst wird das m"oglicherweise expandierbare Argument durch den
% Befehl \verb:\string: vor Expansion beim Schreiben auf ein File
% oder Erzeugen eines Mark gesch"utzt.  Ist das Argument leer, so
% wird die nachfolgende geschweifte Klammer zu einer Klammer mit {\it
% category code\/} "`other"'.  Hierin liegt der Grund, wieso f"ur
% diese Definitionen die {\it category codes\/} der geschweiften
% Klammern ge"-"andert wurden.
%    \begin{macrocode}
\def\grmn@@@active@dq#1(%
\expandafter\grmn@@@@active@dq\expandafter{\string#1})%
%    \end{macrocode}
%
% Nachdem das Argument gesch"utzt wurde, wird f"ur die F"alle, in
% denen \verb:\protect: eine besondere Bedeutung hat, dieses
% eingef"ugt.  Hat das \verb:\protect: "`nur"' die Bedeutung eines
% \verb:\relax: oder eines leeren Makros, so wird es nicht
% eingef"ugt, um Kerning und Ligaturbildung nicht zu verhindern.
%
% Die Makros |\active@dq | und |\dq@prtct |, die ein Leerzeichen im
% Namen haben, sind die "`interne"' Versionen des aktiven
% Double\-quote-Makros und eines Makros, das das Argument sch"utzt.
% Werden diese auf ein File geschrieben und wieder eingelesen, so
% werden dann die entsprechenden Makros ohne diese Leerzeichen im
% Namen verwendet.
%    \begin{macrocode}
\def\grmn@@@@active@dq(%
\ifx\protect\relax\else\ifx\protect\empty\else%
\expandafter\expandafter\expandafter\protect%
\fi\fi%
\active@dq \dq@prtct )%
%    \end{macrocode}
%
% Zuerst zum einfacheren Makropaar |\dq@prtct | und |\dq@protct|, das
% das nachfolgende Argument beim wiederholten Einlesen von und
% Schreiben auf eine Datei sch"utzen soll.  Beim Wiedereinlesen, bei
% dem das Makro |\dq@prtct| verwendet wird, sollen alle Zeichen
% (normalerweise nur Leerzeichen, in seltenen F"allen aber auch die
% Zeichen des Makros |\dq@prtct|) bis zur "offnenden Klammer
% ignoriert werden.  Anschlie"send soll dieses Argument wieder
% gesch"utzt werden, wobei gleich noch ein |\dq@prtct| vorangestellt
% wird, um das Argument bei einem erneuten Schreiben wiederum zu
% sch"utzen.
%    \begin{macrocode}
\def\dq@prtct#1#(\@dq@prtct)%
\def\@dq@prtct#1(\string\dq@prtct{\string#1})%
%    \end{macrocode}
% Das Makro |\dq@prtct | k"onnte auf den ersten Blick einfacher
% definiert werden, da das Argument schon zuvor in
% |\grmn@@@active@dq| gesch"utzt wurde.  Jedoch kann der Fall
% auftreten, da"s zuerst (mit |\protect|$=$|\relax|) expandiert und
% dann erst auf eine Datei geschrieben wird.  Da auch in diesen
% F"allen zumindest die Zeichenkette |\dq@prtct| in diese Datei
% geschrieben werden mu"s, wird dies hier einfach getan\ldots
%    \begin{macrocode}
\def\dq@prtct #1{#2}(\string\dq@prtct{\string#2})%
%    \end{macrocode}
%
% Jetzt folgt noch das Makropaar |\active@dq | und |\active@dq|.
% F"ur |\active@dq |, die interne Version diese Makropaars, mu"s die
% zuvor eingef"ugte Zeichenkette |\dq@prtct| "uberlesen werden und
% die geschweiften Klammern mit {\it category code\/} "`other"' durch
% "`richtige"' Klammern ersetzt.
%    \begin{macrocode}
\def\active@dq #1{#2}(\grmn@active@@dq(#2))%
%    \end{macrocode}
%
% Da die ge"anderten {\it category codes\/} nicht mehr ben"otigt
% wird, wird das Argument des \verb:\lowercase:-Befehl beendet und
% die Gruppe mit diesen "Anderungen geschlossen.
%    \begin{macrocode}
)%
%    \end{macrocode}
%
% Wird |\active@dq| von einer Datei eingelesen, m"ussen alle Token
% bis zur "offnenden Klammer (z.\,B.\ die Zeichenkette |\dq@prtct|)
% "uber"-lesen werden.
%    \begin{macrocode}
\def\active@dq#1#{\grmn@active@@dq}%
%    \end{macrocode}
%
% Zum Schlu"s bleibt nur noch die Auswahl des f"ur diese
% Double\-quote-Kombination abgelegte Definition abh"angig vom
% momentanen Modus.
%    \begin{macrocode}
\def\grmn@active@@dq#1{%
  \csname grmn@dq\ifmmode second\else first\fi
    \expandafter\expandafter\expandafter\expandafter
  \grmn@dq@macro\endcsname{#1}}
%    \end{macrocode}
% Die Makros |\grmn@dqfirst| und |\grmn@dqsecond|, die hier verwendet
% werden, sind schon zuvor definiert worden.
%
%
% \subsection{Liste der Standard-Doublequote-Befehle}
%
% Bisher melden alle \verb:"x:-Befehle einen Fehler, da noch kein
% einzige Double\-quote-Befehl definiert wurde.  Da zumindest die
% Double\-quote-Kombinationen, die eine hexadezimale Konstante
% darstellen k"onnten, "`durchgelassen"' werden sollten, werden diese
% als erste definiert.   Wie schon in den zuvor beschriebenen Makros
% erl"autert, wird den zugeordneten {\it control sequences\/} die
% Bedeutung eines |\noexpand| zugeordnet, um diese spezielle
% Bedeutung zu markieren.
%    \begin{macrocode}
\grmn@dq@macro\let{0}=\noexpand
\let@dqmacro{1}{0}\let@dqmacro{2}{0}\let@dqmacro{3}{0}
\let@dqmacro{4}{0}\let@dqmacro{5}{0}\let@dqmacro{6}{0}
\let@dqmacro{7}{0}\let@dqmacro{8}{0}\let@dqmacro{9}{0}
\let@dqmacro{A}{0}\let@dqmacro{B}{0}\let@dqmacro{C}{0}
\let@dqmacro{D}{0}\let@dqmacro{E}{0}\let@dqmacro{F}{0}
%    \end{macrocode}
% Einige der gerade definierten Kombinationen werden sp"ater
% redefiniert.  Darunter fallen die folgenden Gro"sbuchstaben: A, C,
% E und~F, denen dann die Bedeutungen f"ur Umlaut-A,
% \mbox{CK/K-K}-Trennung, Trema-E und \mbox{FF/FF-F}-Trennung
% zugewiesen wird.  Deshalb kann es zu Problemen mit hexadezimalen
% Konstanten im Bereich \verb:"A0:--\verb:"FF: kommen.
%
% In "alteren Versionen der Style-Option "`german"' konnte man mit
% \verb:"{}: ein normales Double\-quote erzeugen.  Dies sollte aus
% Kompatibilit"at zu "alteren Texten, die dies ausnutzen, auch
% weiterhin m"oglich sein, auch wenn dies der Grund f"ur die zuvor
% beschriebenen Tricks mit den "Anderungen der {\it category codes\/}
% ist.
%    \begin{macrocode}
\def@dqmacro{}{\dq{}}{\dq{}}
%    \end{macrocode}
%
% Die Definition der Kombinationen, die Umlaute erzeugen, ist
% entsprechend einfach,
%    \begin{macrocode}
\def@dqmacro{a}{\@UMLAUT a}{\@MATHUMLAUT a}
\def@dqmacro{o}{\@UMLAUT o}{\@MATHUMLAUT o}
\def@dqmacro{u}{\@UMLAUT u}{\@MATHUMLAUT u}
\def@dqmacro{A}{\@UMLAUT A}{\@MATHUMLAUT A}
\def@dqmacro{O}{\@UMLAUT O}{\@MATHUMLAUT O}
\def@dqmacro{U}{\@UMLAUT U}{\@MATHUMLAUT U}
%    \end{macrocode}
% genauso wie diejenigen f"ur den Buchstaben~\ss.  Leider verhindern
% die Klammern, die f"ur plain-\TeX\ notwendig sind, nach dem
% \verb:\ss: und~\verb:\@SS: in dieser Definition, da"s nach dem~\ss\
% Ligaturen gebildet oder Kerning eingef"ugt werden wird.  Dies soll
% in der n"achsten Version verbessert werden.
%    \begin{macrocode}
\def@dqmacro{s}{\ss{}}{\@SS{}}
\def@dqmacro{S}{SS}{SS}
\let@dqmacro{z}{s}
\def@dqmacro{Z}{SZ}{SZ}
%    \end{macrocode}
% Spezielle Kombinationen f"ur Tremas sind, bis auf die Ausnahme
% des~"`i"' ohne \mbox{I-Punkt}, ebenso einfach\ldots
%    \begin{macrocode}
\def@dqmacro{e}{\highumlaut e}{\@MATHUMLAUT e}
\def@dqmacro{E}{\highumlaut E}{\@MATHUMLAUT E}
\def@dqmacro{i}{\highumlaut{\i}}{\@MATHUMLAUT\imath}
\def@dqmacro{I}{\highumlaut I}{\@MATHUMLAUT I}
%    \end{macrocode}
% wie die Definitionen f"ur die Anf"uhrungszeichen.  Auch hier hat
% man wieder die f"ur plain-\TeX\ notwendigen Klammern, die korrektes
% Kerning und Ligaturbildung nach dem Zeichen verhindern.
%    \begin{macrocode}
\def@dqmacro{`}{\glqq{}}{\glqq{}}
\def@dqmacro{'}{\grqq{}}{\grqq{}}
\def@dqmacro{<}{\flqq{}}{\flqq{}}
\def@dqmacro{>}{\frqq{}}{\frqq{}}
%    \end{macrocode}
%
% Bei den Definitionen der Trennhilfen mu"s nur auf die
% Einschr"ankungen des Mathematik"-modus geachtet werden.
%    \begin{macrocode}
\def@dqmacro{-}{\penalty\@M\-\allowhyphens}%
               {\penalty\@M\-\allowhyphens}
\def@dqmacro{|}{\penalty\@M\discretionary{-}{}{\kern.03em}%
                \allowhyphens}{}
\def@dqmacro{"}{\hskip\z@skip}{\hskip\z@skip}
%    \end{macrocode}
%    \begin{macrocode}
\def@dqmacro{~}{\leavevmode\hbox{-}}{-}
\def@dqmacro{=}{\penalty\@M-\hskip\z@skip}%
               {\penalty\@M-\hskip\z@skip}
%    \end{macrocode}
%
% Um die Definitionen f"ur die Ausnahmen der Silbentrennung zu
% vereinfachen, wird das |\grmn@dqdisc| verwendet, das alle
% gemeinsamen Code-Teile beinhaltet.
%    \begin{macrocode}
\def\grmn@dqdisc#1#2{\penalty\@M
  \ifnum\grmn@dqwarninglevel>\@ne \grmn@dq@warning{#1}\fi
  \discretionary{#2-}{}{#1}\allowhyphens}
%    \end{macrocode}
% Auch bei diesen Definitionen mu"s der Mathematikmodus separat
% gehandhabt werden.  Wie man hier bemerken sollte, liest das
% Double\-quote-Makro nur das n"achste Zeichen und pr"uft nicht nach,
% ob nach der Kombination~\verb:"c: auch ein~{\tt k} folgt.  Dies ist
% bis auf die Kombination~\verb:"f: f"ur die meisten Schriften nicht
% notwendig, da in diesen keine Ligaturen definiert sind.  Jedoch ist
% f"ur {\tt ff} in den meisten Schriften eine Ligatur definiert, die
% auch verwendet werden sollte -- aber leider durch diese Makros
% unter"-dr"uckt wird.
%    \begin{macrocode}
\def@dqmacro{c}{\grmn@dqdisc ck}{c}
\def@dqmacro{C}{\grmn@dqdisc CK}{C}
%    \end{macrocode}
%    \begin{macrocode}
\def@dqmacro{f}{\grmn@dqdisc f{ff}}{f}
\def@dqmacro{F}{\grmn@dqdisc F{FF}}{F}
\def@dqmacro{l}{\grmn@dqdisc l{ll}}{l}
\def@dqmacro{L}{\grmn@dqdisc L{LL}}{L}
\def@dqmacro{m}{\grmn@dqdisc m{mm}}{m}
\def@dqmacro{M}{\grmn@dqdisc M{MM}}{M}
\def@dqmacro{n}{\grmn@dqdisc n{nn}}{n}
\def@dqmacro{N}{\grmn@dqdisc N{NN}}{N}
\def@dqmacro{p}{\grmn@dqdisc p{pp}}{p}
\def@dqmacro{P}{\grmn@dqdisc P{PP}}{P}
\def@dqmacro{r}{\grmn@dqdisc r{rr}}{r}
\def@dqmacro{R}{\grmn@dqdisc R{RR}}{R}
\def@dqmacro{t}{\grmn@dqdisc t{tt}}{t}
\def@dqmacro{T}{\grmn@dqdisc T{TT}}{T}
%    \end{macrocode}
%
%
% \subsection{Definition der Double\-quote-Befehle (cont.)}
%
% Wie schon bei der vorl"aufigen Definition des Makros
% |\grmn@dqredefcheck| er"-w"ahnt, sollten alle
% Definitionen von weiteren Double\-quote-Befehlen zumindest im
% Log-Datei erscheinen.  Dann k"onnen gemeldete Fehler, wenn mit der
% Meldung auch die Log-Datei mitgeschickt wird, schneller eingegrenzt
% werden.  Deshalb wird dieses Makro hier so definiert, da"s es eine
% bei jeder Verwendung von |\def@dqmacro| und |\let@dqmacro| eine
% Zeile in die Log-Datei schreibt -- mit Informationen, welche
% Kombination definiert wird und ob eventuell eine alte Definition
% "uberschrieben wird.
%    \begin{macrocode}
\def\grmn@dqredefcheck#1{%
  \immediate\write\m@ne{german: %
    \grmn@dq@macro\ifx{#1}\relax \else re\fi
    defining dq-command for `\string#1'\on@line.}}%
%    \end{macrocode}
%
%
% \section{Unterst"utzung f"ur Dokumente in anderen Sprachen}
%
% Die Style-Option "`german"' unterst"utzt die Einbindung von
% Textteilen in deutscher Sprache in Dokumente, die in englisch oder
% franz"osisch geschrieben sind.  Die folgenden Befehle sind dagegen
% nur bedingt f"ur "`mehrsprachige"' Texte geeignet, in denen zwei
% oder mehr Sprachen gleichrangig gesetzt werden.  
%
% \subsection{Datumsangaben}
%
%    \begin{macrocode}
\def\month@german{\ifcase\month \or
  Januar\or Februar\or M\"arz\or April\or Mai\or Juni\or
  Juli\or August\or September\or Oktober\or November\or Dezember\fi}
\def\dategerman{\def\today{\number\day.~\month@german
  \space\number\year}}
\def\dateaustrian{\def\today{\number\day.~\ifnum 1=\month
  J\"anner\else \month@german\fi \space\number\year}}
%    \end{macrocode}
%    \begin{macrocode}
\def\month@english{\ifcase\month \or
  January\or February\or March\or April\or May\or June\or
  July\or August\or September\or October\or November\or December\fi}
\def\dateUSenglish{\def\today{\month@english
  \space\number\day, \number\year}}
\def\dateenglish{\def\today{\number\day \ifcase\day \or
  st\or nd\or rd\or th\or th\or th\or th\or th\or th\or th\or%  1..10
  th\or th\or th\or th\or th\or th\or th\or th\or th\or th\or% 11..20
  st\or nd\or rd\or th\or th\or th\or th\or th\or th\or th\or% 21..30
  st\fi
  ~\month@english \space\number\year}}
%    \end{macrocode}
%    \begin{macrocode}
\def\datefrench{\def\today{\number\day \ifnum1=\day \/$^{\rm er}$\fi
  \space\ifcase\month \or
  janvier\or f\'evrier\or mars\or avril\or mai\or juin\or
  juillet\or ao\^ut\or septembre\or
  octobre\or novembre\or d\'ecembre\fi
  \space\number\year}}
%    \end{macrocode}
%
% \subsection{Textteile in "Uberschriften, etc.}
%
% Ab der \LaTeX-Release vom Dezember~1991 sind alle feststehenden
% Textteile in den Standard-Styles und Style-Optionen durch Makros
% \verb:\...name: ersetzt, so da"s man mit einigen Einschr"ankungen
% durch Redefinition dieser Makros eine Sprachanpassung erreichen
% kann.  Will man diese Anpassung auch bei eigenen Styles und
% Style-Optionen erreichen, so sollte man die entsprechenden
% Textteile durch die entsprechenden Makros ersetzen, wobei man
% eine Default-Definition dieser Makros mitliefern sollte.
%
% Als Beispiel mu"s die Definition
%\begin{verbatim}
%\def\tableofcontents{\section*{Contents%
%         \@mkboth{CONTENTS}{CONTENTS}}%
%  \@starttoc{toc}}
%\end{verbatim}
% die in den alten \LaTeX-Releases vor Dezember~1991 in {\tt
% article.sty} zu finden ist, durch
%\begin{verbatim}
%\def\contentsname{Contents}
%\def\tableofcontents{\section*{\contentsname
%        \@mkboth{\uppercase{\contentsname}}%
%                {\uppercase{\contentsname}}}%
%  \@starttoc{toc}}
%\end{verbatim}
% ersetzt werden, um die englische "Uberschrift "`Contents"' f"ur das
% Inhaltsverzeichnis entsprechend anpassen zu k"onnen.
%
% Die folgenden Makros |\captions|\meta{Sprache} definieren alle in
% den \LaTeX-Standard-Styles und \mbox{-Style}-Options verwendeten
% Textteile.
%    \begin{macrocode}
\def\captionsgerman{%
  \def\prefacename{Vorwort}%
  \def\refname{Literatur}%
  \def\abstractname{Zusammenfassung}%
  \def\bibname{Literaturverzeichnis}%
  \def\chaptername{Kapitel}%
  \def\appendixname{Anhang}%
  \def\contentsname{Inhaltsverzeichnis}% % oder nur: Inhalt
  \def\listfigurename{Abbildungsverzeichnis}%
  \def\listtablename{Tabellenverzeichnis}%
  \def\indexname{Index}%
  \def\figurename{Abbildung}%
  \def\tablename{Tabelle}%  % oder: Tafel
  \def\partname{Teil}%
  \def\enclname{Anlage(n)}% % oder: Beilage(n)
  \def\ccname{Verteiler}%   % oder: Kopien an
  \def\headtoname{An}%
  \def\pagename{Seite}%
  \def\seename{siehe}%
  \def\alsoname{siehe auch}}
\let\captionsaustrian=\captionsgerman
%    \end{macrocode}
%    \begin{macrocode}
\def\captionsenglish{%
  \def\prefacename{Preface}%
  \def\refname{References}%
  \def\abstractname{Abstract}%
  \def\bibname{Bibliography}%
  \def\chaptername{Chapter}%
  \def\appendixname{Appendix}%
  \def\contentsname{Contents}%
  \def\listfigurename{List of Figures}%
  \def\listtablename{List of Tables}%
  \def\indexname{Index}%
  \def\figurename{Figure}%
  \def\tablename{Table}%
  \def\partname{Part}%
  \def\enclname{encl}%
  \def\ccname{cc}%
  \def\headtoname{To}%
  \def\pagename{Page}%
  \def\seename{see}%
  \def\alsoname{see also}}
\let\captionsUSenglish=\captionsenglish
%    \end{macrocode}
%    \begin{macrocode}
\def\captionsfrench{%
  \def\prefacename{Pr\'eface}%
  \def\refname{R\'ef\'erences}%
  \def\abstractname{R\'esum\'e}%
  \def\bibname{Bibliographie}%
  \def\chaptername{Chapitre}%
  \def\appendixname{Annexe}%
  \def\contentsname{Table des mati\`eres}%
  \def\listfigurename{Liste des figures}%
  \def\listtablename{Liste des tableaux}%
  \def\indexname{Index}%
  \def\figurename{Figure}%
  \def\tablename{Tableau}%
  \def\partname{Partie}%
  \def\enclname{P.~J.}%
  \def\ccname{Copie \`a}%
  \def\headtoname{A}%
  \def\pagename{Page}%
  \def\seename{voir}%
  \def\alsoname{voir aussi}}%
%    \end{macrocode}
%
% \subsection{Weitere sprachabh"angige Parameter}
%
% Die Sprache eines Dokuments bestimmt neben den Datumsangaben und
% die Textteile in "Uberschriften auch noch weitere Parameter, wie
% z.\,B.\ ob nach einem Satzzeichen, wie Punkten und Kommas, ein
% gr"o"serer Wortzwischenraum eingef"ugt werden soll.  Au"serdem
% sollten auch die den Trennmustern zugeordneten Parametern
% {\tt\string\left\-hyphen\-min} und {\tt\string\right\-hyphen\-min}
% auf entsprechende Werte gesetzt werden.
%
%    \begin{macrocode}
\let\extrasUSenglish=\relax \let\noextrasUSenglish=\empty
\let\extrasenglish=\relax \let\noextrasenglish=\empty
%    \end{macrocode}
%    \begin{macrocode}
\def\extrasgerman{\frenchspacing
  \lefthyphenmin\tw@ \righthyphenmin\tw@}
\def\noextrasgerman{%
  \ifnum\sfcode`\.=\@m \else \noexpand\nonfrenchspacing \fi
  \lefthyphenmin\the\lefthyphenmin \righthyphenmin\the\righthyphenmin}
\let\extrasaustrian=\extrasgerman
\let\noextrasaustrian=\noextrasgerman
%    \end{macrocode}
%    \begin{macrocode}
\def\extrasfrench{\frenchspacing}
\def\noextrasfrench{%
  \ifnum\sfcode`\.=\@m \else \noexpand\nonfrenchspacing \fi}
%    \end{macrocode}
%
%
% \subsection{Default-Werte f"ur Trennmusterwerte deklarieren}
%
% Jeder Sprache und deren zugeordnetem Satz von Trennmustern sollte
% eine Nummer f"ur den \TeX-Parameter \verb:\language: beim Erzeugen
% des Formatfiles zugewiesen worden sein.  Diese Nummern sind f"ur
% jede Sprache in der {\it control sequence\/}
% \verb:\l@:$\langle$Sprache$\rangle$ abgespeichert.
%
% Die Style-Option "`german"' verwendet die Sprache {\tt USenglish},
% {\tt english}, {\tt german}, {\tt austrian} und {\tt french}.  Sind
% f"ur diese Sprache keine Nummern abgespeichert worden, werden diese
% hier als Dialekt einer schon definierten Sprache oder als~$255$
% definiert, so da"s nicht getrennt wird.
%
% Ist f"ur {\tt german} bzw.\ dessen "`Dialekt"' {\tt austrian} kein
% Wert definiert, wird eine entsprechende Meldung ausgegeben.  F"ur
% die anderen Sprache erscheint diese Meldung nur in der
% Protokolldatei.
%
%    \begin{macrocode}
\expandafter\ifx\csname l@USenglish\endcsname\relax
  \expandafter\ifx\csname l@english\endcsname\relax
    \chardef\l@USenglish=255
  \else
    \chardef\l@USenglish=\l@english
  \fi
  \wlog{german -- \string\language\space number for USenglish %
        undefined, default \number\l@USenglish\space used.}
\fi
%    \end{macrocode}
%    \begin{macrocode}
\expandafter\ifx\csname l@english\endcsname\relax
  \chardef\l@english=\l@USenglish
  \wlog{german -- \string\language\space number for UKenglish %
        undefined, default \number\l@english\space used.}
\fi
%    \end{macrocode}
%    \begin{macrocode}
\expandafter\ifx\csname l@german\endcsname\relax
  \expandafter\ifx\csname l@austrian\endcsname\relax
    \chardef\l@german=255
    \message{german -- \string\language\space number for German %
             undefined, default \number\l@german\space used,}
    \message{german -- Please read \string"germdoc.tex\string" how %
             to install hyphenation patterns.}
  \else
    \chardef\l@german=\l@austrian
    \wlog{german -- \string\language\space number for German %
          undefined, default \number\l@german\space used.}
  \fi
\fi
%    \end{macrocode}
%    \begin{macrocode}
\expandafter\ifx\csname l@austrian\endcsname\relax
  \chardef\l@austrian=\l@german
  \wlog{german -- \string\language\space number for Austrian %
        undefined, default \number\l@austrian\space used.}
\fi
%    \end{macrocode}
%    \begin{macrocode}
\expandafter\ifx\csname l@french\endcsname\relax
  \chardef\l@french=255
  \wlog{german -- \string\language\space number for French %
        undefined, default \number\l@french\space used.}
\fi
%    \end{macrocode}
%
% \subsection{Wechsel der Trennmuster, Datumsangabe und
%             "Uberschriften}
%
% Ein Wechsel der Sprache mit |\selectlanguage{|\meta{Sprache}|}|
% schaltet einfach die Datumsangabe, Textteile, Trennmuster und
% anderen Parameter f"ur die angegebene \meta{Sprache} um.
%
% F"ur die n"achste Version ist endlich eine Anpassung an das
% Babel-System geplant.  Au"serdem fehlen momentan noch
% Standard-Makros, um die aktuelle Sprache abzufragen und abh"angig
% von dieser entsprechend reagieren zu k"onnen.
%
% Das Makro |\grmn@originalTeX| enth"alt alle Anweisungen, um die
% Parameter"-anpassungen r"uck"-g"angig machen zu k"onnen, die man
% beim Umschalten auf die momentane Sprache ge"-"andert hat.  Dieses
% Makro mu"s immer expandierbar sein; darf also nicht als |\relax|
% definiert werden.  Zu Beginn sind keine Anweisungen notwendig.
%    \begin{macrocode}
\def\grmn@originalTeX{}
%    \end{macrocode}
%
% Mit dem Makro |\selectlanguage| wird auf die Sprache umgeschaltet.
% Dabei werden, nachdem abgefragt wurde, ob die Sprache definiert
% wurde, zuerst mit |\grmn@originalTeX| alle "Anderungen
% r"uck"-g"angig gemacht, bevor das Datum, die "Uberschriften,
% sonstige Parameter und die Trennmuster umgeschalten werden.
%    \begin{macrocode}
\def\p@selectlanguage#1{\relax
  \expandafter\ifx\csname l@#1\endcsname\relax
    \errhelp{Your command will be ignored, type <return> to proceed}%
    \errmessage{You haven't defined the language #1 yet}%
  \else
    \grmn@originalTeX
    \edef\grmn@originalTeX{\csname noextras#1\endcsname
                       \def\noexpand\grmn@originalTeX{}}%
    \csname date#1\endcsname
    \csname captions#1\endcsname
    %\language \csname l@#1\endcsname\relax
    \csname extras#1\endcsname\relax
    \language \csname l@#1\endcsname\relax
  \fi}
%    \end{macrocode}
%
% Das Makro |\selectlanguage| ist {\it fragile}.  Deshalb wird es
% implizit mit einem |\protect| gesch"utzt.  Da dadurch so oder so
% zwei Makros notwendig sind, k"onnen wir in diesem zweiten Makro
% gleich noch weitere Funktionalit"at stecken:  In "alteren Versionen
% dieser Style-Option mu"ste man die Sprache als {\it control
% sequence}, z.\,B.\ |\german|, eingeben, w"ahrend man in den
% aktuellen Versionen nur noch den Namen, also |german|, verwenden
% sollte.  Damit beides aus Kompatibilit"ats"-gr"unden m"oglich ist,
% wird hier einfach die {\it control sequence\/} umgewandelt und das
% Escape-Zeichen, normarweise ein Back\-slash, mit einem kleinen
% Kniff entfernt.
%    \begin{macrocode}
\def\selectlanguage#1{\protect\p@selectlanguage{%
  \ifnum\escapechar=\expandafter`\string#1\empty
  \else \string#1\empty\fi}}
%    \end{macrocode}
%
% \subsection{Kompatibilit"at mit \TeX~2}
%
% In \TeX\ Version 2.x konnte man Trennmuster f"ur nur eine einzige
% Sprache in einer Format"-datei laden und verwenden.  Deshalb fehlt
% in dieser alten \TeX-Version, die von einigen, wenn auch wenigen
% Personen immer noch verwendet wird/werden mu"s, die Parameter
% |\language|, {\tt\string\left\-hyphen\-min},
% {\tt\string\right\-hyphen\-min}  und das Primitiv
% {\tt\string\set\-language}.  Um diese Style-Option mit dieser alten
% Version verwenden zu k"onnen, werden diese einfach ohne
% Funktionalit"at nachimplementiert.
%
% Die Parameter sind einfache Z"ahler, die mit |\newcount| allokiert
% werden k"onnen und mit sinnvollen, wenn auch nie von \TeX\ selbst
% verwendete Werten initialisiert werden.  Da |\newcount| in
% plain-\TeX\ als "`outer"' deklariert sind, mu"s hier |\csname|
% verwendet werden.
%    \begin{macrocode}
\expandafter\ifx\csname language\endcsname\relax
  \csname newcount\endcsname\language
  \language=0 \fi
\expandafter\ifx\csname lefthyphenmin\endcsname\relax
  \csname newcount\endcsname\lefthyphenmin
  \lefthyphenmin=2 \fi
\expandafter\ifx\csname righthyphenmin\endcsname\relax
  \csname newcount\endcsname\righthyphenmin
  \righthyphenmin=3 \fi
%    \end{macrocode}
%
% F"ur das in \TeX~3 neu hinzugekommene Primitiv
% {\tt\string\set\-language} k"onnte man eine relativ einfache
% Definition verwenden.  Da jedoch Makros die Existenz dieses Befehls
% abpr"ufen und es dann mit der Bedeutung, die es in \TeX~3 besitzt,
% verwenden k"onnten, sollte es das Verhalten, insbesondere dessen
% Einschr"ankungen, dieses neuen Primitivs nachbilden.
% Da |\setlanguage| in "alteren Versionen dieser Style-Option zu
% Wechseln der Sprache verwendet wurde, kann man gleich in der
% Fehlermeldung auf das neue Makro |\selectlanguage| hinweisen.
%    \begin{macrocode}
\expandafter\ifx\csname setlanguage\endcsname\relax
  \def\setlanguage{\relax
    \ifhmode \else
      \errhelp{Use \selectlanguage to switch languages.}%
      \errmessage{\setlanguage allowed only in horizontal mode}%
    \fi
    \begingroup\afterassignment\endgroup\count@=}
\fi
%    \end{macrocode}
%
% \subsection{Ein-/Ausschalten der deutschen Befehle}
%
%    \begin{macrocode}
\begingroup \mdqon
\def\x{\endgroup
  \def\originalTeX{\mdqoff \let"\dq \umlauthigh
    \let\3\grmn@original@three
    \selectlanguage{USenglish}}%
  \def\germanTeX{\mdqon \let"\@active@dq \umlautlow
    \let\grmn@original@three\3\let\3\ss
    \selectlanguage{german}}}%
\x
%    \end{macrocode}
%
% Zum Schlu"s bleibt nur noch das R"ucksetzen des {\it category
% codes\/} des Zeichens~{\tt @} und das Einschalten der deutschen
% Befehle, das gleichzeitig die deutschen Trennmuster aktiviert,
% falls sie geladen wurden.
%    \begin{macrocode}
\catcode`\@=\atcode % return to previous catcode
\germanTeX
%    \end{macrocode}
%
%\iffalse
%</!driver>
%\fi
% \section{Treiberdatei f"ur die Implementierungsdokumentation}
%
% Die Implementierungsdokumentation sollte man sowohl mit \LaTeXe,
% also der offiziellen \LaTeX-Version, als auch mit der alten
% \LaTeX~2.09-Version formatieren k"onnen.
%
%    \begin{macrocode}
%<+driver>\ifx\documentclass\undefined
%<+driver> \documentstyle[newdoc,german]{article}
%<+driver> \ifx\LaTeXe\undefined
%<+driver>  \newcommand{\LaTeXe}{%
%<+driver>   \mbox{\LaTeX\kern.15em$2_{\textstyle\varepsilon}$}}\fi
%<+driver> \MakeShortverb{\|}\CodelineIndex
%<+driver>\else
%<+driver> \documentclass[a4paper]{ltxdoc}
%<+driver> \usepackage{german}
%<+driver>\fi
%<+driver>\begin{document}
%<+driver>\DocInput{german.dtx}
%<+driver>\end{document}
%    \end{macrocode}
%
% Ich hoffe, das Lesen dieser Dokumentation hat einige Einblicke in
% die Implementierung der Style-Option "`german"' gegeben.  Da ich
% sie haupt"-s"achlich als eigene Ged"achtnisst"utze geschrieben
% habe, kaum Korrekturen vorgenommen habe, ist sie unvoll"-st"andig,
% ent"-h"alt viele \mbox{Tipp-}, Ausdrucks- und sonstige Fehler.
%
% \Finale
%
\endinput
%% End of GERMAN.STY
